package com.internetCafes.spms.web.job.task.sys;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.internetCafes.spms.common.CommonConstants;
import com.internetCafes.spms.common.module.sms.SmsAlidayu;
import com.internetCafes.spms.common.utils.DateUtils;
import com.internetCafes.spms.web.certificate.service.CertificateInfoService;
import com.internetCafes.spms.web.certificate.vo.CertificateInfoVo;
import com.internetCafes.spms.web.sys.model.SmsLog;
import com.internetCafes.spms.web.sys.model.UserInfo;
import com.internetCafes.spms.web.sys.service.SmsLogService;
import com.internetCafes.spms.web.sys.service.UserInfoService;
import com.internetCafes.spms.web.tenant.model.TenantInfo;
import com.internetCafes.spms.web.tenant.service.TenantInfoService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.internetCafes.spms.core.utils.DateUtils.getBeAfDay;

/**
 * testTask为spring bean的名称
 *
 * @author Sunny
 * @email rekeeper2011@hotmail.com
 * @date 2016年11月30日 下午1:34:24
 */
@Component("pushOrderInfoTask")
public class PushOrderInfoTask {
    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private UserInfoService userInfoService;

    @Autowired
    private SmsLogService smsLogService;

    @Autowired
    private TenantInfoService tenantInfoService;

    @Autowired
    private CertificateInfoService certificateInfoService;


    /**
     * 三个月内到期，一个星期发一次短信
     * 定时任务执行间隔:每天早上九点
     * <p>
     * 情况1，三种到期期限证书都有:【虹合科技】尊敬的*用户,贵单位有*本证书将在7天后到期,注意及时处理。还有*本证书将在15天后到期,*本证书将在90天后到期。
     * <p>
     * 情况2，有两种到期期限证书【虹合科技】尊敬的*用户,贵单位有*本证书将在*天后到期,注意及时处理。还有*本证书将在*天后到期。
     * <p>
     * 情况3，有一种到期期限证书【虹合科技】尊敬的*用户,贵单位有*本证书将在*天后到期,注意及时处理。
     * <p>
     * 如没有需要预警证书，则不发送短信。发送短信时到期时间近的放在前面。
     * <p>
     * 早上10点，
     * 文案【银田网络】尊敬的*用户,贵公司有*本证书将在7天内到期,*本15天内到期,*本在90天内到期。
     * 注意：15内包括7天内的数量
     * 发送规则：当天有7天、15、90到期的证书发送通知，其他情况不发送。
     */
    /*@Scheduled(cron = "0 40 10 * * ?")
    public void sendExpireNotice() {

        List<TenantInfo> tenantInfoList = tenantInfoService.query(new HashMap<>());
        for (int i = 0; i < tenantInfoList.size(); i++) {
            TenantInfo tenantInfo = tenantInfoList.get(i);
            Map<String, Object> params = new HashMap<>();
            params.put("tenantId", tenantInfo.getTenantId());
            params.put("statuses", CommonConstants.CertificateStatus.EXCEPT_DELETE);
            params.put("validityEndTime", DateUtils.format(getBeAfDay(7)));
            List<CertificateInfoVo> certificateInfoVos = certificateInfoService.selectByJobParams(params);
            if (CollectionUtils.isNotEmpty(certificateInfoVos)) {
                Long[] count = getCount(tenantInfo.getTenantId());
                sendToALlEmployees(tenantInfo.getTenantId(), count);
                continue;
            }
            params.put("validityEndTime", DateUtils.format(getBeAfDay(15)));
            certificateInfoVos = certificateInfoService.selectByJobParams(params);
            if (CollectionUtils.isNotEmpty(certificateInfoVos)) {
                Long[] count = getCount(tenantInfo.getTenantId());
                sendToALlEmployees(tenantInfo.getTenantId(), count);
                continue;
            }
            params.put("validityEndTime", DateUtils.format(getBeAfDay(90)));
            certificateInfoVos = certificateInfoService.selectByJobParams(params);
            if (CollectionUtils.isNotEmpty(certificateInfoVos)) {
                Long[] count = getCount(tenantInfo.getTenantId());
                sendToALlEmployees(tenantInfo.getTenantId(), count);
                continue;
            }
        }
    }*/

    private Long[] getCount(Long tenantId) {
        Map<String, Object> params = new HashMap<>();
        params.put("tenantId", tenantId);
        params.put("statuses", CommonConstants.CertificateStatus.EXCEPT_DELETE);
        params.put("beIvalidity", getBeAfDay(7));
        long sevenDays = certificateInfoService.countByJobParams(params);
        params.put("beIvalidity", getBeAfDay(15));
        long halfMonth = certificateInfoService.countByJobParams(params);
        params.put("beIvalidity", com.internetCafes.spms.core.utils.DateUtils.getBeAfMonth(3));
        long threeMonths = certificateInfoService.countByJobParams(params);
        return new Long[]{sevenDays, halfMonth, threeMonths};
    }

    private void sendToALlEmployees(Long tenantId, Long[] count) {
        Map<String, Object> params = new HashMap<>();
        params.put("tenantId", tenantId);
        params.put("status", CommonConstants.CommonStatus.ENABLE);
        List<UserInfo> userInfos = userInfoService.queryList(params);
        for (int i = 0; i < userInfos.size(); i++) {
            UserInfo u = userInfos.get(i);
            if (u.getMobile() != null) {
                /*SmsAlidayu.sendExpireNotice(u.getMobile(), u.getDeptName(), count[0], count[1], count[2]);*/
                String context = "尊敬的" + u.getDeptName() + "用户，贵单位有" + count[0] + "本证书将在7天内到期," + count[1] + "本证书将在15天内到期," + count[2] + "本证书将在90天内到期";
                SmsLog smsLog = new SmsLog(2, u.getDeptId(), u.getUserId(), u.getNickName(), u.getMobile(), context, 1);
                /*smsLogService.save(smsLog);*/
                System.out.println(smsLog);
            }
        }
    }
}
